import datetime
from sqlite3 import IntegrityError
from typing import List
from peewee import *
from config.log_config import AntLogger

from common.enum.form_items_key import FormItemsKey
from service.das.data_map_das import DataDictionaryDas
from service.strategy.base_strategy import BaseStrategy
from service.strategy_invoke_service import StratrgyInvokeService
from views.template_page_view import FormItemDto


class DataDictionaryService:

    # 增加数据字典项
    def saveOrUpdateCommonSetting(
        self, dict_key: str, dict_value: str, dict_desc: str = None
    ):
        """
        聚合查询、更新或新增数据字典项的方法。
        如果字典键已存在，则更新；如果不存在，则创建。
        """
        try:
            # 实例化数据字典 DAS
            dataMapDas = DataDictionaryDas()

            # 尝试查询现有数据
            existing_item = dataMapDas.get_item_by_key(dict_key)
            if existing_item:
                # 如果存在，执行更新
                dataMapDas.update_dictionary_item(dict_key, dict_value, dict_desc)
                AntLogger.info(f"字典项 {dict_key} 已更新为：值={dict_value}, 描述={dict_desc}")
            else:
                # 如果不存在，执行创建
                dataMapDas.add_dictionary_item(dict_key, dict_value, dict_desc)
                AntLogger.info
                    f"字典项 {dict_key} 已创建成功：值={dict_value}, 描述={dict_desc}"
                )

        except Exception as e:
            AntLogger.info(f"保存或更新字典项时出错：{e}")

    # 查询所有数据字典项
    def getAllCommonSetting(self):

        dataMapDas = DataDictionaryDas()
        form_items = self.extract_form_items()

        keys_to_query = [item.form_key for item in form_items]
        queried_items = dataMapDas.get_items_by_keys(keys_to_query)

        # 将查询结果转换为字典 {key: DataDictionary}
        result_map = {item.dict_key: item.dict_value for item in queried_items}

        # 合并覆盖 form_items 的值
        for form_item in form_items:
            if form_item.form_key in result_map:
                # 使用查询结果覆盖 form_item 的 form_value
                form_item.form_value = result_map[form_item.form_key]

        # 返回最新的 form_items 列表
        return form_items

    def extract_form_items(self) -> List[FormItemDto]:
        """
        遍历 FormItemsKey 枚举并提取所有配置项的 FormItemDto 对象。
        :return: 包含 FormItemDto 的列表。
        """
        return [item.form_item for item in FormItemsKey]

    def aggregate(self):
        """
        聚合逻辑：
        1. 动态加载模块内的策略类。
        2. 将策略类的元数据信息与 DTO 对比。
        3. 如果匹配，将 `check_flag` 更新为 True 并同步元数据字段。
        """
        # 获取所有策略类
        module_name = "service.strategy"
        strategyService = StratrgyInvokeService()
        strategy_classes = strategyService.find_all_subclasses_in_package(
            BaseStrategy, module_name
        )

        # 提取策略元数据信息
        strategy_metadata_map = {
            cls.strategyConfig().strategy_code: cls.strategyConfig()
            for cls in strategy_classes
        }

        # 更新 DTO
        for dto in self.dto_list:
            if dto.strategy_code in strategy_metadata_map:
                metadata = strategy_metadata_map[dto.strategy_code]

                # 更新 DTO 的相关字段
                dto.check_flag = True
                dto.strategy_name = metadata.strategy_name
                dto.strategy_group = metadata.strategy_group
                dto.strategy_type = metadata.strategy_type
                dto.analysis_day = metadata.analysis_day
                dto.strategy_level = metadata.strategy_level
            else:
                dto.check_flag = False

        return self.dto_list
